/*
 * Require-CSS RequireJS css! loader plugin
 * 0.1.10
 * Guy Bedford 2014
 * MIT
 */

/*
 *
 * Usage:
 *  require(['css!./mycssFile']);
 *
 * Tested and working in (up to latest versions as of March 2013):
 * Android
 * iOS 6
 * IE 6 - 10
 * Chrome 3 - 26
 * Firefox 3.5 - 19
 * Opera 10 - 12
 * 
 * browserling.com used for virtual testing environment
 *
 * Credit to B Cavalier & J Hann for the IE 6 - 9 method,
 * refined with help from Martin Cermak
 * 
 * Sources that helped along the way:
 * - https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent
 * - http://www.phpied.com/when-is-a-stylesheet-really-loaded/
 * - https://github.com/cujojs/curl/blob/master/src/curl/plugin/css.js
 *
 */

define(function() {
    //>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)
      if (typeof window == 'undefined')
        return { load: function(n, r, load){ load() } };
    
      var head = document.getElementsByTagName('head')[0];
    
      var engine = window.navigator.userAgent.match(/Trident\/([^ ;]*)|AppleWebKit\/([^ ;]*)|Opera\/([^ ;]*)|rv\:([^ ;]*)(.*?)Gecko\/([^ ;]*)|MSIE\s([^ ;]*)|AndroidWebKit\/([^ ;]*)/) || 0;
    
      // use <style> @import load method (IE < 9, Firefox < 18)
      var useImportLoad = false;
      
      // set to false for explicit <link> load checking when onload doesn't work perfectly (webkit)
      var useOnload = true;
    
      // trident / msie
      if (engine[1] || engine[7])
        useImportLoad = parseInt(engine[1]) < 6 || parseInt(engine[7]) <= 9;
      // webkit
      else if (engine[2] || engine[8] || 'WebkitAppearance' in document.documentElement.style)
        useOnload = false;
      // gecko
      else if (engine[4])
        useImportLoad = parseInt(engine[4]) < 18;
    
    //>>excludeEnd('excludeRequireCss')
      //main api object
      var cssAPI = {};
    
    //>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)
      cssAPI.pluginBuilder = './css-builder';
    
      // <style> @import load method
      var curStyle, curSheet;
      var createStyle = function () {
        curStyle = document.createElement('style');
        head.appendChild(curStyle);
        curSheet = curStyle.styleSheet || curStyle.sheet;
      }
      var ieCnt = 0;
      var ieLoads = [];
      var ieCurCallback;
      
      var createIeLoad = function(url) {
        curSheet.addImport(url);
        curStyle.onload = function(){ processIeLoad() };
        
        ieCnt++;
        if (ieCnt == 31) {
          createStyle();
          ieCnt = 0;
        }
      }
      var processIeLoad = function() {
        ieCurCallback();
     
        var nextLoad = ieLoads.shift();
     
        if (!nextLoad) {
          ieCurCallback = null;
          return;
        }
     
        ieCurCallback = nextLoad[1];
        createIeLoad(nextLoad[0]);
      }
      var importLoad = function(url, callback) {
        if (!curSheet || !curSheet.addImport)
          createStyle();
    
        if (curSheet && curSheet.addImport) {
          // old IE
          if (ieCurCallback) {
            ieLoads.push([url, callback]);
          }
          else {
            createIeLoad(url);
            ieCurCallback = callback;
          }
        }
        else {
          // old Firefox
          curStyle.textContent = '@import "' + url + '";';
    
          var loadInterval = setInterval(function() {
            try {
              curStyle.sheet.cssRules;
              clearInterval(loadInterval);
              callback();
            } catch(e) {}
          }, 10);
        }
      }
    
      // <link> load method
      var linkLoad = function(url, callback) {
        var link = document.createElement('link');
        link.type = 'text/css';
        link.rel = 'stylesheet';
        if (useOnload)
          link.onload = function() {
            link.onload = function() {};
            // for style dimensions queries, a short delay can still be necessary
            setTimeout(callback, 7);
          }
        else
          var loadInterval = setInterval(function() {
            for (var i = 0; i < document.styleSheets.length; i++) {
              var sheet = document.styleSheets[i];
              if (sheet.href == link.href) {
                clearInterval(loadInterval);
                return callback();
              }
            }
          }, 10);
        link.href = url;
        head.appendChild(link);
      }
    
    //>>excludeEnd('excludeRequireCss')
      cssAPI.normalize = function(name, normalize) {
        if (name.substr(name.length - 4, 4) == '.css')
          name = name.substr(0, name.length - 4);
    
        return normalize(name);
      }
    
    //>>excludeStart('excludeRequireCss', pragmas.excludeRequireCss)
      cssAPI.load = function(cssId, req, load, config) {
    
        (useImportLoad ? importLoad : linkLoad)(req.toUrl(cssId + '.css'), load);
    
      }
    
    //>>excludeEnd('excludeRequireCss')
      return cssAPI;
    });